#ifndef prs_FrmFrame_H
#define prs_FrmFrame_H

#include "prs_FrmFunc.h"
#include "prs_FrmRules.h"
#include "prs_FrmControl.h"
#include "prs_FrmGeom.h"
#include "prs_FrmFrameStyle.h"
#include "frm_control_TFrame.h"

namespace prs {

///////////////////////////////////////////////////////////////////////////////
struct TNodeFrmFrame;
///////////////////////////////////////////////////////////////////////////////

struct TNodeFrmFrameClient : public TNodeFrmControl
{
  DECLARE_ClientNode()
  //
  TAttrNodeType<nodeType_FrameClient> NodeType;
  TAttrPointerNoCopy<attrName_Control,frm::control::TFrameClient*> Control;
  //
  TNodeFrmFrameClient() : NodeType(this),Control(this) {}
};

///////////////////////////////////////////////////////////////////////////////

struct TNodeFrmFrameControl : public frm::control::TFrame
{
  TNodeFrmFrameControl(
    frm::control::TWindow &Window,
    TNodeFrmFrame &Node
  ):TFrame(Window),node(Node) {}
  
private:  
  TNodeFrmFrame &node;
};

///////////////////////////////////////////////////////////////////////////////

struct TNodeFrmFrame : public TNodeFrmControl
{
  DECLARE_ClientNode()
  //
  typedef TNodeFrmFrameStyle   TStyle;
  typedef TNodeFrmFrameControl TControl;
  //
  TAttrNodeType<nodeType_Frame> NodeType;
  TAttrPointerNoCopy<attrName_Control,TNodeFrmFrameControl*> Control;
  TAttrNodeObject<attrName_Client,TNodeFrmFrameClient> Client;
  //
  TNodeFrmFrame() : NodeType(this),Control(this),Client(this) {}
 ~TNodeFrmFrame() { delete Control.GetValue();}
  //
  TNodeFrmFrameControl *BuildControl(
    frm::control::TPanel *ParentControl
  );
};
                   
///////////////////////////////////////////////////////////////////////////////

struct TRuleFrmFrame : public snt::TRule
{
  TRuleFrmFrame(
    snt::text::TContext &Context,
    svl::TVariant &VParentNode,
    TRuleFrmChildrenBase &RChildren,
    TRuleSetNodeIdOptionally &RSetNodeIdOptionally,
    TRuleFrmGeom &RFrmGeom,
    TRuleSetStyle &RStyle
  );

private:  
  TNodeFrmFrame *GetNodeFrame() { return dynamic_cast<TNodeFrmFrame*>(vParentNode.Pointer());}
  void FSetGeometryFrame(snt::TParams &Params) { rGeometry.SetGeom( &GetNodeFrame()->Geometry.Value );}
  //
  void FSetClient(snt::TParams &Params) { vParentNode = &GetNodeFrame()->Client.Value;}
  //
  svl::TVariant &vParentNode;
  TRuleFrmGeom &rGeometry;
  snt::TRule  RAttr,RAttr1;
  snt::TAlter AAttr1;
  svl_Except;
};

///////////////////////////////////////////////////////////////////////////////
}

#endif
